using System;
using System.Collections;
using UnityEngine;

public class Enemy : MonoBehaviour
{
    [NonSerialized]
    public float speed;
    private Rigidbody2D target; // 目标（玩家）
    bool isLive = true; // 是否存活
    Rigidbody2D rigid;
    SpriteRenderer spriter;
    Animator anim;
    [NonSerialized]
    public float health;//当前生命值
    [NonSerialized]
    public float maxHealth;//最大生命值
    public RuntimeAnimatorController[] animCon;// 不同类型精灵的动画控制器

    WaitForFixedUpdate wait;

    Collider2D coll;

    void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
        spriter = GetComponent<SpriteRenderer>();
        anim = GetComponent<Animator>();
        wait = new WaitForFixedUpdate();//等待下一帧 FixedUpdate() 调用
        coll = GetComponent<Collider2D>();
    }

    private void OnEnable()
    {
        target = GameManager.instance.player.GetComponent<Rigidbody2D>();
        isLive = true;
        health = maxHealth;
        coll.enabled = true;
        rigid.simulated = true;
        spriter.sortingOrder = 1;
        anim.SetBool("Dead", false);
    }

    //初始化敌人的属性和状态
    public void Init(SpawnData data)
    {
        // 根据生成数据设置敌人的动画控制器、速度、最大生命值和当前生命值
        anim.runtimeAnimatorController = animCon[data.spriteType];
        speed = data.speed;
        maxHealth = data.health;
        health = data.health;
    }

    void FixedUpdate()
    {
        if(!GameManager.instance.isLive) return;
        //anim.GetCurrentAnimatorStateInfo(0).IsName("Hit")判断0层（第一个层级）的动画状态是否为名为 "Hit" 的状态
        if (!isLive || anim.GetCurrentAnimatorStateInfo(0).IsName("Hit")) return;

        // 根据目标的位置和自身的位置决定是否翻转精灵
        spriter.flipX = (target.position.x < rigid.position.x);

        // 计算目标位置和当前位置之间的方向向量
        Vector2 dirVec = target.position - rigid.position;
        // 计算下一帧移动的位置向量，保持单位长度并乘以速度和固定时间步长
        Vector2 nextVec = dirVec.normalized * speed * Time.fixedDeltaTime;
        // 移动到下一帧位置
        rigid.MovePosition(rigid.position + nextVec);
    }

    private void Update()
    {
        if(!GameManager.instance.isLive) return;
        if (anim.GetCurrentAnimatorStateInfo(0).IsName("Dead"))
        {
            //持续的获取动画进度
            AnimatorStateInfo info = anim.GetCurrentAnimatorStateInfo(0);
            if (info.normalizedTime >= 1)
            {
                //当播放完动画后
                Dead();
            }
        }
    }

    void OnTriggerEnter2D(Collider2D collision)
    {
        if (!collision.CompareTag("Bullet")) return;
        health -= collision.GetComponent<Bullet>().damage;
        StartCoroutine(KnockBack()); // 启动协程，执行击退效果
        if (health > 0)
        {
            anim.SetTrigger("Hit"); // 播放受击动画
            AudioManager.instance.PlaySfx(AudioManager.Sfx.Hit);
        }
        else
        {
            isLive = false;
            coll.enabled = false;
            rigid.simulated = false;
            spriter.sortingOrder = 0;//死亡降低排序，不要遮挡其他敌人
            anim.SetBool("Dead", true);
            
            GameManager.instance.kill++;
            GameManager.instance.GetExp();
            AudioManager.instance.PlaySfx(AudioManager.Sfx.Dead);
        }
    }
    
    void Dead()
    {
        gameObject.SetActive(false);
    }

    IEnumerator KnockBack()
    {
        yield return wait; // 等待一段时间

        Vector3 playerPos = GameManager.instance.player.transform.position; // 获取玩家的位置
        Vector3 dirVec = transform.position - playerPos; // 计算从玩家位置指向当前位置的方向向量
        rigid.AddForce(dirVec.normalized * 3, ForceMode2D.Impulse); // 施加一个以该方向为单位向量的冲量，实现击退效果
    }
}